from sqlalchemy import  Column, Integer, String, Float, ForeignKey, Date
from sqlalchemy.orm import relationship
from database import Base

'''
models 负责构建跟数据库表对应的类（ORM类），可以直接建表 /理解成数据库的映射样子 所以继承的是Base类调用orm框架
记住，在构造db类的时候要用sqlalchemy的数据类型做映射
'''


# 班级表
class Stu_class_db(Base):
    __tablename__ = "Stuclass"

    class_id = Column(String(6),
                      primary_key=True,  # 标记为主键
                      comment="班级编号")

    class_name = Column(String(20), comment="班级编号")


# 学生信息表
class Student_db(Base):
    __tablename__ = "Student"

    # 学生编号9位，前6位是学生班级，作为主键
    student_id = Column(Integer, primary_key=True, autoincrement=True, comment="系统自动生成")

    # 学生班级，与学生编号前6位对应,是一个外键
    class_id = Column(String(6), ForeignKey(Stu_class_db.class_id),
                      comment="学生班级编号(6位)")

    to_class = relationship("Stu_class_db", backref="to_student")

    # 学生姓名，非空且合理长度
    student_name = Column(String(50), comment="学生姓名")

    # 籍贯，非空且合理长度
    native_place = Column(String(100), comment="学生籍贯")

    # 毕业院校，非空且合理长度
    graduate_school = Column(String(100), comment="毕业院校")

    # 专业，非空且合理长度
    major = Column(String(50), comment="专业")

    # 入学时间，date类型
    enrollment_date = Column(Date, comment="入学时间(年月日)")

    # 毕业时间，date类型
    graduation_date = Column(Date, comment="毕业时间(年月日)")

    # 学历，限定为本科、专科、硕士、博士
    education = Column(String(10), comment="学历")

    # 顾问编号，合理长度
    advisor_id = Column(String(20), comment="顾问编号")

    # 年龄在0-100之间
    age: int = Column(Integer, comment="年龄(0-100之间)")

    # 性别，限定为男或女
    gender = Column(String(10), comment="性别(男/女)")


class Stu_score_db(Base):
    __tablename__ = "Score"

    # 每一个成绩的id
    score_id = Column(Integer,
                      primary_key=True,  # 标记为主键
                      autoincrement=True,  # 显式开启自增（大多数数据库可省略，默认开启）
                      comment="成绩编号")

    # 学生编号作为外键
    student_id = Column(Integer, ForeignKey(Student_db.student_id), comment="系统自动生成")

    to_student = relationship("Student_db", backref="to_score")

    # 考核序次 记录第几次考试
    round = Column(Integer)

    # 考核分数
    score = Column(Integer)


# 毕业信息表
class Stu_employment_db(Base):
    __tablename__ = "Employment"

    # 每一个信息的id
    emp_id = Column(Integer,
                      primary_key=True,  # 标记为主键
                      autoincrement=True,  # 显式开启自增（大多数数据库可省略，默认开启）
                      comment="信息编号")

    # 学生编号作为外键
    student_id = Column(Integer, ForeignKey(Student_db.student_id), comment="系统自动生成")

    to_student = relationship("Student_db", backref="to_emp")
    # 就业开放时间采用日期类
    open_time = Column(Date, comment="就业开放时间")

    # offer下放时间
    offer_time = Column(Date, comment="就业开放时间")

    # 公司名字
    company = Column(String(50), comment="公司名")

    # 就业薪资
    salary = Column(Integer, comment="就业薪资")
